[10] 虛擬環境建置


Posted by bessyhuang on 2023-06-19

虛擬環境

簡介

虛擬環境(Virtual Environment)
在 Python 中, 虛擬環境 是一個獨立的資料夾,並且裡面裝好了特定版本的 Python,以及一系列相關的 套件

  • 優點:
    • 你的專案會擁有一個專屬的獨立 Python 環境。
    • 不需要 root 權限,就可以安裝新套件。
    • 方便控管不同版本的套件,不用擔心升級套件會影響到其他專案。
    • 如果需要多人協作或在不同機器上跑同一個專案時,使用虛擬環境也可以確保環境一致性。
  • 注意:
    • 假如 Project / Application B 需要某個 package 升級到 version=3.0,也不會影響到 Project / Application A 的環境。
    • 當你不需要虛擬環境時,直接刪除 虛擬環境的資料夾 即可。

為何需要虛擬環境?

  • 情境:一台電腦需要使用 相同套件但不同版本 的時候
    • Project / Application A 需要 package C(version=1.0)
    • Project / Application B 需要 package C(version=2.0)
    • 安裝 package C 在同一台電腦上,則不管安裝 1.0 或是 2.0 都會衝突,以致於其中一個 Project / Application 無法使用。
  • 解決方案
    • 針對每個 Project / Application,各別創建『 虛擬環境(完全獨立且隔離的運行環境) 』來使用,避免干擾到同一系統上運行的其他 Project / Application。
      • 意即
        • Project / Application A 創建一個虛擬環境來安裝 package C(version=1.0)
        • Project / Application B 創建一個虛擬環境來安裝 package C(version=2.0)

pip 套件管理工具

從 Python 3.4 開始,它被預設包含在 Python 二進制安裝程式中。
  • 在安裝套件之前,請先確認是否已安裝 套件管理工具(Package Manager),如:pip。
  • 套件管理工具(Package Manager)
    • 如 pip、npm、yarn、apt-get 等,用來讓你更加『 方便 』安裝、刪除、升級原有系統或開發語言 所缺少的第三方工具。
  • PyPI(Python 官方第三方軟體倉儲, The Python Package Index)
    • 如果用生活的例子來比喻,就像 Android 手機,有 google play 可以安裝軟體。Iphone 有 app store 來安裝軟體。在這之中 PyPI 就像是 google play 或是 app store。
    • 在我們使用 pip 安裝套件的時候,下指令 pip install 套件名稱 預設就是從 PyPI 下載套件。

用於建置虛擬環境的 Python 套件

💡 venv 套件:
用來建立與管理虛擬環境的套件。venv 通常會安裝你能夠取得的最新版本的 Python。
不需要安裝。

💡 virtualenv 套件:
用來建立與管理虛擬環境的套件。venv 通常會安裝你能夠取得的最新版本的 Python。
需要安裝:pip install virtualenv

建置步驟

Step 1: 建立專案資料夾

$ mkdir 自訂資料夾名稱
$ cd 自訂資料夾名稱

Step 2: 在專案資料夾內,建立 python3 虛擬環境

💡 注意!
虛擬環境建立後,千萬不要對虛擬環境目錄進行任何更名/搬動/複製 (任何影響到虛擬環境的絕對路徑的活動都不行)。

搬動它,會使你的虛擬環境錯亂;
複製它,複製出來的虛擬環境還是和原來的相關, 而不是獨立的一份。

這是因為目前 venv 在產生 activate.bat(批次檔 = Batch) 時,是將虛擬環境的路徑直接寫死在檔案裡。

註:
Windows 批次檔 (batch):
是一種用來當成手稿語言運作程式的檔案。它本身是文字文件,`其中包含了一系列讓具備命令列介面的直譯器讀取並執行的指令`,副檔名為 bat。
簡單來說就是一個 `操控 windows 的程式`。
  • 建立 python3 虛擬環境,兩種方式:

    • 方式一:使用 venv 套件

        #MacOS
        $ python3 -m venv 自訂虛擬環境名稱
      
        #Windows
        $ python -m venv 自訂虛擬環境名稱
      
    • 方式二:使用 virtualenv 套件

        #MacOS
        $ pip3 install virtualenv
        $ virtualenv 自訂虛擬環境名稱
      
        #Windows
        $ pip install virtualenv
        $ virtualenv 自訂虛擬環境名稱
      
    • 安裝不同 Python 版本的虛擬環境

        $ where python3.11
        /usr/local/bin/python3.11
      
        $ virtualenv 自訂虛擬環境名稱 -p "python 資料夾路徑"
        $ virtualenv MyVenv -p "/usr/local/bin/python3.11"
      
  • 預期的目錄架構

      ~/Downloads » tree project_demo -L 2
    
      project_demo
      └── MyVenv
          ├── bin
          ├── include
          ├── lib
          └── pyvenv.cfg
    

Step 3: 啟動虛擬環境

#MacOS
$ source 自訂虛擬環境名稱/bin/activate

#Windows
$ 自訂虛擬環境名稱\Scripts\activate.bat
  • 啟動虛擬環境,長怎樣呢?
    • 出現 (自訂虛擬環境名稱) → 啟動虛擬環境 成功
    • Linux / MacOS
        (自訂虛擬環境名稱) $
      
    • Windows
        (自訂虛擬環境名稱) C:\>
      

Step 4: 在虛擬環境內,安裝任何需要的套件

$ pip install 套件名稱

Step 5: 關閉虛擬環境

  • Linux / MacOS
      $ deactivate
    
  • Windows
      $ 自訂虛擬環境名稱\Scripts\deactivate
      $ deactivate
    
  • 關閉虛擬環境,長怎樣呢?
    • (自訂虛擬環境名稱) 消失了~ → 關閉虛擬環境 成功
    • Linux / MacOS
        $
      
    • Windows
        C:\>
      

pip 套件管理工具 的常用指令

  • 若為 Linux / MacOS 且 不在虛擬環境內 安裝套件,則 pip 安裝指令應改為 pip3 install 套件名稱;反之,若為 Linux / MacOS 且 在虛擬環境內 安裝套件,則 pip 安裝指令為 pip install 套件名稱
  • 若為 Windows,在安裝套件時 不論是否在虛擬環境內,pip 安裝指令為 pip install 套件名稱

查詢 pip 版本

$ pip -V

安裝套件

$ pip install 套件名稱
$ pip install 套件名稱==某個特定版本

e.g. `pip install Django==1.9.10`

升級套件

$ pip install 套件名稱 --upgrade

解除安裝 / 刪除 套件

$ pip uninstall 套件名稱

顯示虛擬環境中所有已經安裝的套件(shows ALL installed packages.)

$ pip list

顯示一個特定套件的資訊

$ pip show 套件名稱

匯出已安裝的套件

$ pip freeze > requirements.txt

讀取 requirements.txt 還原虛擬環境

$ rm -r MyVenv
$ python3 -m venv NewVenv
$ source NewVenv/bin/activate

$ pip install -r requirements.txt

References

  1. 【 Python 教學 】什麼是 PyPI?跟 pip 又有什麼關係呢?
  2. 使用 Python 虛擬環境

#Python #Virtual Env #pip







Related Posts

Day 96

Day 96

There's no hierarchy of pain

There's no hierarchy of pain

DNS, Lock, NoSQL vs SQL and ACID

DNS, Lock, NoSQL vs SQL and ACID


Comments